﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Configuration;

using rent_car.Manejadores;

namespace rent_car.Gui
{
    public partial class FormNuevoCliente : Form
    {
        public FormNuevoCliente()
        {
            Inicializar();
            
        }

        public FormNuevoCliente(cliente clienteAModificar)
        {
            Inicializar();
            clienteModificado = clienteAModificar;
            cargarCampos();            
        }

        private void Inicializar()
        {
            InitializeComponent();
            manejadorDeClientes = ManejadorDeClientes.getInstancia();
            validadorUniversal = new ValidadorDeFormularios();
            manejadorDeCiudades = ManejadorDeCiudades.getInstancia();
            cagarCbCiudades();
            comp = new compania();
            conductor = new conductore();
            pathImagenCliente = ConfigurationSettings.AppSettings["pathImagenDefault"];
            ofPassaporte.FileName = "";
            ofPassaporte.Filter = "JPEG Imágenes|*.jpg|GIF Imágenes|*.gif|PNG Imágenes|*.png";
        }

        private void cargarCampos()
        {
            txtNombre.Text = clienteModificado.persona.nombre;
            txtApellido.Text = clienteModificado.persona.apellido;
            txtTelefono.Text = clienteModificado.persona.telefono;
            txtCelular.Text = clienteModificado.persona.celular;
            if (clienteModificado.persona.fecha_nac != null)
            {
                dtFechaNacimiento.Value = clienteModificado.persona.fecha_nac.Value;
            }
            if (clienteModificado.persona.sexo == 'F')
            {
                rbFemenino.Checked = true;
                rbMaculino.Checked = false;
            }
            txtEmail.Text = clienteModificado.persona.email;
            if (clienteModificado.persona.ciudade != null)
            {
                cbCiudades.SelectedIndex = manejadorDeCiudades.getItem(clienteModificado.persona.ciudade.ciudad_id - 1);
            }
            txtDireccion.Text = clienteModificado.persona.direccion;
            txtObservacion.Text = clienteModificado.persona.observacion;
            txtLicencia.Text = clienteModificado.persona.no_lic;
            txtTarjCredito.Text = clienteModificado.persona.no_tarj_cred;
            if (clienteModificado.persona.fecha_exp_lic != null)
            {
                dtFechaExpLic.Value = clienteModificado.persona.fecha_exp_lic.Value;
            }
            if (clienteModificado.persona.fecha_exp_tarj_cre != null)
            {
                dtFechaExpTarj.Value = clienteModificado.persona.fecha_exp_tarj_cre.Value;
            }
            txtPasaporte.Text = clienteModificado.pasaporte;
            if (clienteModificado.compania != null)
            {                
                txtCompania.Text = clienteModificado.compania.nombre;
                txtTelComp1.Text = clienteModificado.compania.telefono1;
                txtTelComp2.Text = clienteModificado.compania.telefono2;
                txtCelComp.Text = clienteModificado.compania.celular;
                txtFaxComp.Text = clienteModificado.compania.fax;
                txtEmailComp.Text = clienteModificado.compania.email;
                txtDireccionComp.Text = clienteModificado.compania.direccion;
                cbCiudadComp.SelectedIndex = manejadorDeCiudades.getItem(clienteModificado.compania.ciudade.ciudad_id - 1);
            }
            if(clienteModificado.conductore != null)
            {
                txtNombreCond.Text = clienteModificado.conductore.persona.nombre;
                txtApellidoCond.Text = clienteModificado.conductore.persona.apellido;
                txtNoLicCond.Text = clienteModificado.conductore.persona.no_lic;
                if (clienteModificado.conductore.persona.fecha_exp_lic != null)
                {
                    dtFechaExpLicCond.Value = clienteModificado.conductore.persona.fecha_exp_lic.Value;
                }
                if (clienteModificado.conductore.persona.fecha_nac != null)
                {
                    dtFechaNacCond.Value = clienteModificado.conductore.persona.fecha_nac.Value;
                }
            
            }
        }

        private void cagarCbCiudades()
        {
            ManejadorDeCiudades mc = ManejadorDeCiudades.getInstancia();
            ciudade[] ciudadesCliente = new ciudade[mc.getObject().Count];
            List<ciudade> ciudades = (List<ciudade>)mc.getObject();
            for (int i = 0; i < ciudadesCliente.Length; i++)
            {
                ciudadesCliente[i] = ciudades.ElementAt(i);
            }
            cbCiudades.DataSource = ciudadesCliente;

            ciudade[] ciudadesComp = new ciudade[mc.getObject().Count];
            for (int i = 0; i < ciudadesComp.Length; i++)
            {
                ciudades[i] = ciudades.ElementAt(i);
            }
            cbCiudadComp.DataSource = ciudades;
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (validarCampos())
            {
                if (clienteModificado == null)
                {
                    guardarImagen();
                    agregarCliente();
                    MessageBox.Show(null, "Cliente agregado con éxito", "Información", MessageBoxButtons.OK);
                }
                else
                {
                    modificarCliente();
                    manejadorDeClientes.modificar(clienteModificado, companiaExiste);
                    MessageBox.Show(null, "Cliente modificado con éxito", "Información", MessageBoxButtons.OK);
                }
            }
        }

        private void modificarCliente()
        {
            if (clienteModificado.compania == null)
            {
                crearCompania();
                clienteModificado.compania = comp;
            }
            else
            {
                ciudade ciudadComp = (ciudade)cbCiudadComp.SelectedItem;
                companiaExiste = true;
                clienteModificado.compania.ciudade = ciudadComp;
                clienteModificado.compania.nombre = txtCompania.Text;
                clienteModificado.compania.direccion = txtDireccionComp.Text;
                clienteModificado.compania.telefono1 = txtTelComp1.Text;
                clienteModificado.compania.telefono2 = txtTelComp2.Text;
                clienteModificado.compania.celular = txtCelComp.Text;
                clienteModificado.compania.email = txtEmailComp.Text;
                clienteModificado.compania.fax = txtFaxComp.Text;
            }
            if (clienteModificado.conductore.persona == null)
            {
                crearConductor();
                clienteModificado.conductore = conductor;
            }
            else
            {
                clienteModificado.conductore.persona.nombre = txtNombreCond.Text;
                clienteModificado.conductore.persona.apellido = txtApellidoCond.Text;
                clienteModificado.conductore.persona.no_lic = txtNoLicCond.Text;
                clienteModificado.conductore.persona.fecha_nac = Convert.ToDateTime(dtFechaNacCond.Text);
                clienteModificado.conductore.persona.fecha_exp_lic = Convert.ToDateTime(dtFechaExpLicCond.Text);
            }
            ciudade ciudad = (ciudade)cbCiudades.SelectedItem; 
            clienteModificado.persona.nombre = txtNombre.Text;
            clienteModificado.persona.apellido = txtApellido.Text;
            clienteModificado.persona.telefono = txtTelefono.Text;
            clienteModificado.persona.celular = txtCelular.Text;
            clienteModificado.persona.sexo = elegirSexo();
            clienteModificado.persona.fecha_nac = DateTime.Parse(dtFechaNacimiento.Text);
            clienteModificado.persona.no_lic = txtLicencia.Text;
            clienteModificado.persona.fecha_exp_lic = DateTime.Parse(dtFechaExpLic.Text);
            clienteModificado.persona.email = txtEmail.Text;
            clienteModificado.persona.direccion = txtDireccion.Text;
            clienteModificado.persona.no_tarj_cred = txtTarjCredito.Text;
            clienteModificado.persona.fecha_exp_tarj_cre = DateTime.Parse(dtFechaExpTarj.Text);
            clienteModificado.persona.mal_historial = false;
            clienteModificado.persona.observacion = txtObservacion.Text;
            clienteModificado.persona.ciudad_id = ciudad.ciudad_id;
            clienteModificado.persona.ciudade = ciudad;
            clienteModificado.pasaporte = txtPasaporte.Text;
            clienteModificado.activo = true;           
            clienteModificado.img_pasaporte = pathImagenCliente;
        }

        private void crearCompania()
        {
            ciudade ciudadComp = (ciudade)cbCiudadComp.SelectedItem;
            comp.ciudade = ciudadComp;
            comp.nombre = txtCompania.Text;
            comp.direccion = txtDireccionComp.Text;
            comp.telefono1 = txtTelComp1.Text;
            comp.telefono2 = txtTelComp2.Text;
            comp.celular = txtCelComp.Text;
            comp.email = txtEmailComp.Text;
            comp.fax = txtFaxComp.Text;
        }

        private void crearConductor()
        {
            persona personaConductor = new persona()
            {
                nombre = txtNombreCond.Text,
                apellido = txtApellidoCond.Text,
                no_lic = txtNoLicCond.Text,
                fecha_nac = Convert.ToDateTime(dtFechaNacCond.Text),
                fecha_exp_lic = Convert.ToDateTime(dtFechaExpLicCond.Text)
            };
            conductor.persona = personaConductor;
           
        }

        // Agregar cliente
        private void agregarCliente()
        {
            ciudade ciudad = (ciudade)cbCiudades.SelectedItem;
            crearConductor();
            crearCompania();

            persona personaCliente = new persona()
            {
                nombre = txtNombre.Text,
                apellido = txtApellido.Text,
                telefono = txtTelefono.Text,
                celular = txtCelular.Text,
                sexo = elegirSexo(),
                fecha_nac = DateTime.Parse(dtFechaNacimiento.Text),
                no_lic = txtLicencia.Text,
                fecha_exp_lic = DateTime.Parse(dtFechaExpLic.Text),
                email = txtEmail.Text,
                direccion = txtDireccion.Text,
                no_tarj_cred = txtTarjCredito.Text,
                fecha_exp_tarj_cre = DateTime.Parse(dtFechaExpTarj.Text),
                mal_historial = false,
                observacion = txtObservacion.Text,
                ciudad_id = ciudad.ciudad_id,
                ciudade = ciudad
            };

            cliente cliente = new cliente()
            {
                persona = personaCliente,
                pasaporte = txtPasaporte.Text,
                activo = true,
                conductore = conductor,
                compania = comp,
                img_pasaporte = pathImagenCliente
            };
            manejadorDeClientes.agregar(cliente);
            limpiarCampos();
        }

        private char elegirSexo()
        {
            if (rbMaculino.Checked)
            {
                return 'M';
            }
            else
            {
                return 'F';
            }
        }

        // Obtiene el path de la imagen que se desea guardar
        private void obtenerImagen()
        {
            if (ofPassaporte.ShowDialog() != DialogResult.Cancel)
            {
                pathImagen = ofPassaporte.FileName;
                string pathImagenFolder = ConfigurationSettings.AppSettings["pathFolderVehiculos"];

                FileInfo fI = new FileInfo(pathImagen);
                pathImagenAGuardar = pathImagenFolder + @"\" + fI.Name;
                if (Directory.Exists(pathImagenFolder))
                {
                    if (File.Exists(pathImagenAGuardar))
                    {
                        MessageBox.Show(null, "La imagen no pudo ser guardada, \n \"ya existe un archivo con ese nombre\"", "Alerta", MessageBoxButtons.OK);
                        obtenerImagen();
                    }
                }
                else
                {
                    Directory.CreateDirectory(pathImagenFolder);
                    obtenerImagen();
                }
            }
            else
            {
                //lblMsjPasaporteError.Visible = true;
            }
        }

        // Guarda la imagen en la carpeta especifíca y setea la variable
        // pathImagenCliente con la dirección de la imagen que va ser guardada
        // en la base de datos
        private void guardarImagen()
        {
            try
            {
                File.Copy(pathImagen, pathImagenAGuardar);
                pathImagenCliente = pathImagenAGuardar;
            }
            catch (Exception ex)
            {
                pathImagenAGuardar = ConfigurationSettings.AppSettings["pathImagenDefault"];
                MessageBox.Show(null, "La imagen no pudo ser guardada", "Alerta", MessageBoxButtons.OK);
                obtenerImagen();
            }
        }

        private void btnCargarPasaporte_Click(object sender, EventArgs e)
        {
            obtenerImagen();
        }

        private void FormNuevoCliente_Load(object sender, EventArgs e)
        {
            cagarCbCiudades();
        }

        private bool validarCampos()
        {
            return validadorUniversal.validarCamposEspecificos(txtNombre, txtApellido, txtDireccion, txtLicencia, cbCiudades);
        }

        private void validarCompania()
        {
            if (txtCompania.Text.Trim().Equals(""))
            {
                txtCompania.Focus();
                MessageBox.Show(null, "Introduzca el nombre de la compañía", "Alerta", MessageBoxButtons.OK);
            }
        }

        private bool validarIngresoCompania()
        {
            if (!txtCompania.Text.Equals(""))
            {
                validadorUniversal.validarCamposEspecificos(cbCiudadComp, txtDireccionComp);
                return true;
            }
            else
            {
                return false;
            }
        }

        #region validarCompania


        private void txtTelComp2_GotFocus(object sender, EventArgs e)
        {
            validarCompania();
        }
        private void txtDireccionComp_GotFocus(object sender, EventArgs e)
        {
            validarCompania();
        }
        private void txtEmailComp_GotFocus(object sender, EventArgs e)
        {
            validarCompania();
        }
        private void cbCiudadComp_GotFocus(object sender, EventArgs e)
        {
            validarCompania();
        }
        private void txtCelComp_GotFocus(object sender, EventArgs e)
        {
            validarCompania();
        }
        private void txtFaxComp_GotFocus(object sender, EventArgs e)
        {
            validarCompania();
        }
        #endregion

        #region limpiar ErrorProvider
        private void txtLicencia_LostFocus(object sender, EventArgs e)
        {
            validadorUniversal.limpiarErrores(txtLicencia);
        }

        private void txtNombre_LostFocus(object sender, EventArgs e)
        {
            validadorUniversal.limpiarErrores(txtNombre);
        }

        private void txtApellido_LostFocus(object sender, EventArgs e)
        {
            validadorUniversal.limpiarErrores(txtApellido);
        }

        private void txtDireccion_LostFocus(object sender, EventArgs e)
        {
            validadorUniversal.limpiarErrores(txtDireccion);
        }

        private void cbCiudades_LostFocus(object sender, EventArgs e)
        {
            validadorUniversal.limpiarErrores(cbCiudades);
        }

        private void txtTelComp1_GotFocus(object sender, EventArgs e)
        {
            validarCompania();
        }

        #endregion

        private void limpiarCampos()
        {
            validadorUniversal.LimpiarCampos(gbDatosPersonales);
            validadorUniversal.LimpiarCampos(gbPertenecias);
            validadorUniversal.LimpiarCampos(gbCompania);
            validadorUniversal.LimpiarCampos(gbConductor);
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (pathImagenCliente != ConfigurationSettings.AppSettings["pathImagenDefault"])
            {
                File.Delete(pathImagenCliente);
            }
        }

        private ManejadorDeClientes manejadorDeClientes = null;

        private ValidadorDeFormularios validadorUniversal = null;

        private cliente clienteModificado = null;

        private string pathImagenCliente = null;

        private ManejadorDeCiudades manejadorDeCiudades = null;

        private string pathImagen = null;

        private compania comp = null;

        private conductore conductor = null;

        private bool companiaExiste = false;

        private string pathImagenAGuardar = null;

       
       
    }
}
